package me.gacl.demo;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import org.junit.Test;

import me.gacl.utils.JdbcUtils;

/*
元数据指的是"数据库"、"表"、"列"的定义信息。

1.1、DataBaseMetaData元数据

　　Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象。
　　DataBaseMetaData对象的常用方法：

getURL()：返回一个String类对象，代表数据库的URL。
getUserName()：返回连接当前数据库管理系统的用户名。
getDatabaseProductName()：返回数据库的产品名称。
getDatabaseProductVersion()：返回数据库的版本号。
getDriverName()：返回驱动驱动程序的名称。
getDriverVersion()：返回驱动程序的版本号。
isReadOnly()：返回一个boolean值，指示数据库是否只允许读操作。
 */

public class DataBaseMetaDataTest {
	/**
	 * @Method: testDataBaseMetaData
	 * @Description: 获取数据库的元信息
	 * @Anthor:孤傲苍狼
	 *
	 * @throws SQLException
	 */
	@Test
	public void testDataBaseMetaData() throws SQLException {

		Connection conn = JdbcUtils.getConnection();
		DatabaseMetaData metadata = conn.getMetaData();
		// getURL()：返回一个String类对象，代表数据库的URL
		System.out.println(metadata.getURL());
		// getUserName()：返回连接当前数据库管理系统的用户名
		System.out.println(metadata.getUserName());
		// getDatabaseProductName()：返回数据库的产品名称
		System.out.println(metadata.getDatabaseProductName());
		// getDatabaseProductVersion()：返回数据库的版本号
		System.out.println(metadata.getDatabaseProductVersion());
		// getDriverName()：返回驱动驱动程序的名称
		System.out.println(metadata.getDriverName());
		// getDriverVersion()：返回驱动程序的版本号
		System.out.println(metadata.getDriverVersion());
		// isReadOnly()：返回一个boolean值，指示数据库是否只允许读操作
		System.out.println(metadata.isReadOnly());
		JdbcUtils.release(conn, null, null);
	}

	/*
	 * 1.2、ParameterMetaData元数据
	 * 
	 * PreparedStatement.getParameterMetaData()
	 * 获得代表PreparedStatement元数据的ParameterMetaData对象。 Select * from user where name=?
	 * And password=? ParameterMetaData对象的常用方法：
	 * 
	 * getParameterCount()： 获得指定参数的个数 getParameterType(int
	 * param)：获得指定参数的sql类型，MySQL数据库驱动不支持
	 */
	/**
	 * @Method: testParameterMetaData
	 * @Description: 获取参数元信息
	 * @Anthor:孤傲苍狼
	 *
	 * @throws SQLException
	 */
	@Test
	public void testParameterMetaData() throws SQLException {
		Connection conn = JdbcUtils.getConnection();
		String sql = "select * from user wherer name=? and password=?";
		// 将SQL预编译一下
		PreparedStatement st = conn.prepareStatement(sql);
		ParameterMetaData pm = st.getParameterMetaData();
		// getParameterCount() 获得指定参数的个数
		System.out.println(pm.getParameterCount());
		// getParameterType(int param)：获得指定参数的sql类型，MySQL数据库驱动不支持
		// System.out.println(pm.getParameterType(1));
		JdbcUtils.release(conn, null, null);
	}

	/*
	 * 1.3、ResultSetMetaData元数据
	 * 
	 * ResultSet. getMetaData() 获得代表ResultSet对象元数据的ResultSetMetaData对象。
	 * ResultSetMetaData对象的常用方法：
	 * 
	 * getColumnCount() 返回resultset对象的列数 getColumnName(int column) 获得指定列的名称
	 * getColumnTypeName(int column)获得指定列的类型
	 */
	/**
	 * @Method: testResultSetMetaData
	 * @Description: 结果集的元数据
	 * @Anthor:孤傲苍狼
	 *
	 * @throws Exception
	 */
    @Test
    public void testResultSetMetaData() throws Exception {
    		Connection conn = JdbcUtils.getConnection();
    		String sql = "select * from account";
    		PreparedStatement st = conn.prepareStatement(sql);
    		ResultSet rs = st.executeQuery();
    		 //ResultSet.getMetaData()获得代表ResultSet对象元数据的ResultSetMetaData对象
    		ResultSetMetaData metaData = rs.getMetaData();
    		 //getColumnCount() 返回resultset对象的列数
    		System.out.println(metaData.getColumnCount());
    		//getColumnName(int column) 获得指定列的名称
    		System.out.println(metaData.getColumnName(1));
    		//getColumnTypeName(int column)获得指定列的类型
    		System.out.println(metaData.getColumnTypeName(1));
    		JdbcUtils.release(conn, st, rs);
    }

}
